package com.itextpdf.text.pdf;
import com.itextpdf.testutils.CompareTool;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.parser.*;
import com.itextpdf.text.xml.XMLUtil;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
public class TaggedPdfTest {
private Document document;
private PdfWriter writer;
private Paragraph h1;
private static final String text = new String("Lorem ipsum dolor sit amet," +
"consectetur adipiscing elit." +
"Pellentesque a lectus sit amet lectus accumsan aliquam." +
"Quisque facilisis ullamcorper dolor, quis gravida leo faucibus in. Donec a dolor ligula, quis placerat nunc. Etiam enim velit, egestas in lacinia at, ultricies eu massa." +
"Cras ornare felis id quam vehicula lobortis. Ut semper malesuada nulla, in vulputate dui eleifend at. Phasellus pulvinar nisl a lorem volutpat pellentesque. In vitae" +
"ligula et quam vestibulum iaculis eget vitae massa. Fusce vitae leo ut diam suscipit dictum in id sapien. Praesent mi ligula, auctor vitae ultrices in, venenatis non" +
"odio. Nullam sit amet velit pellentesque lectus consectetur lacinia nec quis mi. In hac habitasse platea dictumst." +
"Quisque facilisis ullamcorper dolor, quis gravida leo faucibus in." +
"Donec a dolor ligula, quis placerat nunc.\n" +
"1. Etiam enim velit, egestas in lacinia at, ultricies eu massa. Cras ornare felis id quam vehicula lobortis. Ut semper malesuada nulla, in vulputate dui eleifend at." +
"Phasellus pulvinar nisl a lorem volutpat pellentesque. In vitae ligula et quam vestibulum iaculis eget vitae massa. Fusce vitae leo ut diam suscipit dictum in id" +
"sapien. Praesent mi ligula, auctor vitae ultrices in, venenatis non odio. Nullam sit amet velit pellentesque lectus consectetur lacinia nec quis mi. In hac" +
"habitasse platea dictumst.\n" +
"2. Morbi euismod, nunc quis malesuada feugiat, dui nibh rhoncus leo, quis cursus erat tellus vel tortor. Mauris nibh dolor, iaculis et pharetra pretium," +
"pellentesque vitae erat. Aenean enim nisi, euismod quis ultricies vel, convallis nec nulla. Suspendisse nisl purus, molestie et egestas ac, cursus in mauris." +
"Aliquam erat volutpat. Donec at nulla in elit faucibus mollis ac vel enim. Nullam dapibus dui sit amet sem consectetur ac vulputate est sagittis. Aliquam luctus" +
"ornare nulla. Mauris adipiscing congue pharetra. Proin tempus, nibh sed pretium tempor, arcu est hendrerit est, et dignissim odio leo non purus." +
"Suspendisse non elit massa. Vestibulum tincidunt ipsum vitae dui congue sagittis. Aenean porttitor tristique euismod. Nulla id justo in quam imperdiet" +
"facilisis ut non turpis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" +
"3. Aliquam non elit ligula, nec hendrerit urna. Mauris ut velit sapien. Sed in convallis diam. Nulla faucibus, purus a porttitor ultrices, est quam convallis magna," +
"molestie aliquam sapien nulla eget metus. Integer nec enim mi, eu mattis massa. Integer quis sapien vel purus pretium ullamcorper ac id dui. Suspendisse" +
"pellentesque tellus sit amet neque pulvinar egestas lacinia diam imperdiet.\n" +
"4. Curabitur hendrerit, sem et facilisis vestibulum, massa felis vestibulum ligula, ut faucibus massa nisi in neque. Nulla facilisi. Etiam diam mauris, pellentesque" +
"lacinia dapibus at, lobortis non quam. Nullam et neque quis diam vestibulum scelerisque ullamcorper non mauris. Cras massa enim, commodo malesuada" +
"tincidunt ac, lobortis eu erat. Sed sed risus velit. Suspendisse tellus tortor, ullamcorper nec tristique ac, semper non nulla. Maecenas vitae diam orci, sed" +
"fermentum enim. Curabitur a libero nisl, vel laoreet nulla. Integer id volutpat sem. Pellentesque blandit, tellus at consequat dictum, urna sem elementum nisi," +
"a bibendum nisi ipsum sit amet felis. Donec mattis ipsum nec metus lobortis eget volutpat nisl volutpat.\n" +
"5. Fusce in aliquet nibh. Etiam quis varius ipsum. Vivamus sit amet mauris a libero iaculis semper in a neque. Nam faucibus congue posuere. Cras vitae nibh" +
"sed magna ultricies pretium. Proin eget lacus quis dui ullamcorper cursus commodo in lacus. Quisque et sem id leo venenatis dictum dignissim et felis." +
"Vestibulum enim urna, vehicula vel dictum in, congue quis sapien. Quisque ac mauris tellus. Nulla cursus pellentesque mauris viverra bibendum. Fusce" +
"molestie dui id sem blandit in convallis justo euismod. Curabitur velit nisi, adipiscing sed consequat et, dignissim eget dolor. Aenean malesuada quam id mi" +
"vestibulum pulvinar. Nullam diam quam, lobortis sit amet semper vitae, tempus eget dolor.");
private void initializeDocument(String path) throws DocumentException, FileNotFoundException {
initializeDocument(path, PdfWriter.VERSION_1_7);
}
private void initializeDocument(String path, char pdfVersion) throws DocumentException, FileNotFoundException {
new File("./target/com/itextpdf/test/pdf/TaggedPdfTest/").mkdirs();
Document.compress = false;
document = new Document();
writer = PdfWriter.getInstance(document, new FileOutputStream(path));
writer.setPdfVersion(pdfVersion);
writer.setTagged();
document.open();
//Required for PDF/UA
writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
document.addLanguage("en-US");
document.addTitle("Some title");
writer.createXmpMetadata();
Chunk c = new Chunk("Document Header", new Font(Font.FontFamily.HELVETICA,14,Font.BOLD,BaseColor.BLUE));
h1 = new Paragraph(c);
h1.setRole(PdfName.H1);
}
@Test
public void createTaggedPdf0() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out0.pdf");
Paragraph paragraph = new Paragraph();
Chunk c = new Chunk(" Hello ");
paragraph.add(c);
c = new Chunk(" world\n\n");
paragraph.add(c);
ColumnText columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(paragraph);
columnText.go();
document.close();
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out0.pdf");
paragraph = new Paragraph();
c = new Chunk(" ");
paragraph.add(c);
columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(paragraph);
columnText.go();
document.close();
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out0.pdf");
paragraph = new Paragraph();
c = new Chunk("Hello World");
paragraph.add(c);
columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(paragraph);
columnText.go();
document.close();
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out0.pdf");
paragraph = new Paragraph();
c = new Chunk("Hello World");
paragraph.add(c);
document.add(paragraph);
document.close();
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out0.pdf");
paragraph = new Paragraph();
c = new Chunk(" Hello ");
paragraph.add(c);
c = new Chunk(" world\n");
paragraph.add(c);
paragraph.setFont(new Font(Font.FontFamily.HELVETICA,8,Font.NORMAL,BaseColor.RED));
document.add(paragraph);
document.close();
}
@Test
public void createTaggedPdf1() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out1.pdf");
Paragraph paragraph = new Paragraph(text);
paragraph.setFont(new Font(Font.FontFamily.HELVETICA, 8, Font.NORMAL, BaseColor.RED));
ColumnText columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(h1);
columnText.addElement(paragraph);
columnText.go();
columnText.setSimpleColumn(300, 36, 500, 800);
columnText.go();
document.close();
compareResults("1");
}
@Test
public void createTaggedPdf2() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out2.pdf");
Paragraph paragraph = new Paragraph(text);
ColumnText columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36,36,400,800);
columnText.addElement(h1);
columnText.addElement(paragraph);
columnText.go();
document.newPage();
columnText.setSimpleColumn(36, 36, 400, 800);
columnText.go();
document.close();
compareResults("2");
}
@Test
public void createTaggedPdf3() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out3.pdf");
Paragraph paragraph = new Paragraph(text);
document.add(h1);
document.add(paragraph);
document.close();
compareResults("3");
}
@Test
public void createTaggedPdf4() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out4.pdf");
Paragraph p = new Paragraph();
PdfName nParagraph = new PdfName("Paragraph");
p.setRole(nParagraph);
writer.getStructureTreeRoot().mapRole(nParagraph, PdfName.P);
try {
Chunk c = new Chunk("Quick brown ");
PdfName nTextBlock = new PdfName("TextBlock");
c.setRole(nTextBlock);
writer.getStructureTreeRoot().mapRole(nTextBlock, PdfName.SPAN);
p.add(c);
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
c = new Chunk(i, 0, 0);
PdfName nImage = new PdfName("Image");
c.setRole(nImage);
writer.getStructureTreeRoot().mapRole(nImage, PdfName.FIGURE);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
p.add(c);
p.add(new Chunk(" jumped over a lazy "));
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
p.add(c);
} catch (Exception e) {
}
document.add(h1);
document.add(p);
document.close();
compareResults("4");
}
@Test
public void createTaggedPdf5() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out5.pdf");
List list = new List(true);
try {
list = new List(true);
ListItem listItem = new ListItem(new Chunk("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line."));
list.add(listItem);
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
Chunk c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
listItem = new ListItem(c);
list.add(listItem);
listItem = new ListItem(new Chunk("jumped over a lazy"));
list.add(listItem);
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
listItem = new ListItem(c);
list.add(listItem);
} catch (Exception e) {
}
document.add(h1);
document.add(list);
document.close();
compareResults("5");
}
@Test
public void createTaggedPdf6() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out6.pdf");
ColumnText columnText = new ColumnText(writer.getDirectContent());
List list = new List(true);
try {
list = new List(true);
ListItem listItem = new ListItem(new Chunk("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line."));
list.add(listItem);
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
Chunk c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
listItem = new ListItem(c);
list.add(listItem);
listItem = new ListItem(new Chunk("jumped over a lazy"));
list.add(listItem);
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
listItem = new ListItem(c);
list.add(listItem);
} catch (Exception e) {
}
columnText.setSimpleColumn(36,36,400,800);
columnText.addElement(h1);
columnText.addElement(list);
columnText.go();
document.close();
compareResults("6");
}
@Test
public void createTaggedPdf7() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out7.pdf");
List list = new List(true);
try {
list = new List(true);
ListItem listItem = new ListItem(new Chunk("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line."));
list.add(listItem);
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
Chunk c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
listItem = new ListItem(c);
list.add(listItem);
listItem = new ListItem(new Chunk("jumped over a lazy"));
list.add(listItem);
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
listItem = new ListItem(c);
list.add(listItem);
listItem = new ListItem(new Paragraph(text));
list.add(listItem);
} catch (Exception e) {
}
document.add(h1);
document.add(list);
document.close();
compareResults("7");
}
@Test
public void createTaggedPdf8() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out8.pdf");
ColumnText columnText = new ColumnText(writer.getDirectContent());
List list = new List(true);
try {
list = new List(true);
ListItem listItem = new ListItem(new Chunk("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line."));
list.add(listItem);
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
Chunk c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
listItem = new ListItem(c);
list.add(listItem);
listItem = new ListItem(new Chunk("jumped over a lazy"));
list.add(listItem);
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
listItem = new ListItem(c);
list.add(listItem);
listItem = new ListItem(new Paragraph(text));
list.add(listItem);
} catch (Exception e) {
}
columnText.setSimpleColumn(36,36,400,800);
columnText.addElement(h1);
columnText.addElement(list);
columnText.go();
document.newPage();
columnText.setSimpleColumn(36, 36, 400, 800);
columnText.go();
document.close();
compareResults("8");
}
@Test
public void createTaggedPdf9() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out9.pdf");
PdfPTable table = new PdfPTable(2);
try {
table.addCell("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line.");
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
i.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
table.addCell(i);
table.addCell("jumped over a lazy");
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
i.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
table.addCell(i);
table.addCell("Hello World");
Paragraph p = new Paragraph(text);
table.addCell(p);
} catch (Exception e) {
}
document.add(h1);
document.add(table);
document.add(new Paragraph("Extra paragraph at the end of the document. Please make sure that this is really last portion of page content."));
document.close();
compareResults("9");
}
@Test
public void createTaggedPdf10() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out10.pdf");
PdfPTable table = new PdfPTable(2);
try {
table.addCell("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line.");
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
i.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
table.addCell(i);
table.addCell("jumped over a lazy");
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
i.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
table.addCell(i);
PdfPTable t = new PdfPTable(2);
t.addCell("Quick brown fox jumped over a lazy dog. A very long line appears here because we need new line.");
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
i.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
t.addCell(i);
t.addCell("jumped over a lazy");
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
i.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
t.addCell(i);
t.addCell(text);
t.addCell("Hello World");
table.addCell(t);
Paragraph p = new Paragraph(text);
table.addCell(p);
} catch (Exception e) {
}
document.add(h1);
document.add(table);
document.close();
compareResults("10");
}
@Test
public void createTaggedPdf11() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out11.pdf");
Chapter c = new Chapter(new Paragraph("First chapter", new Font(Font.FontFamily.HELVETICA,16,Font.BOLD,BaseColor.BLUE)), 1);
c.setTriggerNewPage(false);
c.setIndentation(40);
Section s1 = c.addSection(new Paragraph("First section of a first chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
Section s2 = s1.addSection(new Paragraph("First subsection of a first section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a first section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a first section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s1 = c.addSection(new Paragraph("Second section of a first chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a second section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a second section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a second section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s1 = c.addSection(new Paragraph("Third section of a first chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a third section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a third section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a third section of a first chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
document.add(c);
c = new Chapter(new Paragraph("Second chapter", new Font(Font.FontFamily.HELVETICA,16,Font.BOLD,BaseColor.BLUE)), 2);
c.setTriggerNewPage(false);
c.setIndentation(40);
s1 = c.addSection(new Paragraph("First section of a second chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a first section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a first section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a first section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s1 = c.addSection(new Paragraph("Second section of a second chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a second section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a second section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a second section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s1 = c.addSection(new Paragraph("Third section of a second chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a third section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a third section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a third section of a second chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
document.add(c);
c = new Chapter(new Paragraph("Third chapter", new Font(Font.FontFamily.HELVETICA,16,Font.BOLD,BaseColor.BLUE)), 3);
c.setTriggerNewPage(false);
c.setIndentation(40);
s1 = c.addSection(new Paragraph("First section of a third chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a first section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a first section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a first section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s1 = c.addSection(new Paragraph("Second section of a third chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a second section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a second section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a second section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s1 = c.addSection(new Paragraph("Third section of a third chapter", new Font(Font.FontFamily.HELVETICA,13,Font.BOLD,BaseColor.BLUE)));
s1.setIndentation(20);
s2 = s1.addSection(new Paragraph("First subsection of a third section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Second subsection of a third section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
s2 = s1.addSection(new Paragraph("Third subsection of a third section of a third chapter", new Font(Font.FontFamily.HELVETICA,10,Font.BOLD,BaseColor.BLUE)));
s2.setIndentation(10);
s2.add(new Paragraph("Some text..."));
document.add(c);
c = new Chapter(4);
c.setTriggerNewPage(false);
c.setIndentation(40);
c.addSection("First section of a fourths chapter, the chapter itself is invisible");
document.add(c);
document.close();
compareResults("11");
}
@Test
public void createTaggedPdf12() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out12.pdf");
PdfPTable table = new PdfPTable(2);
PdfPCell cell = new PdfPCell(new Paragraph("header 1"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("header 2"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("footer 1"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("footer 2"));
cell.setColspan(2);
table.addCell(cell);
table.setHeaderRows(4);
table.setFooterRows(2);
try {
for (int i = 1; i <= 50; i++) {
table.addCell("row " + i + ", column 1");
table.addCell("row " + i + ", column 2");
}
} catch (Exception e) {
}
document.add(table);
document.close();
compareResults("12");
}
@Test
public void createTaggedPdf13() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out13.pdf");
Paragraph p = new Paragraph();
Chunk chunk = new Chunk("Please visit ");
p.add(chunk);
PdfAction action = new PdfAction("http://itextpdf.com");
chunk = new Chunk("http://itextpdf.com", new Font(Font.FontFamily.HELVETICA,Font.UNDEFINED,Font.UNDERLINE,BaseColor.BLUE));
chunk.setAction(action);
p.add(chunk);
p.add(new Chunk(" for more details."));
document.add(p);
document.close();
compareResults("13");
}
@Test
public void createTaggedPdf14() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out14.pdf");
Paragraph paragraph = new Paragraph("Document MUST contain 1 page only!");
document.newPage();
ColumnText columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(paragraph);
columnText.go();
document.close();
PdfReader reader = new PdfReader("./target/com/itextpdf/test/pdf/TaggedPdfTest/out14.pdf");
Assert.assertEquals(1, reader.getNumberOfPages());
}
@Test
public void createTaggedPdf15() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out15.pdf");
Paragraph p = new Paragraph();
Chunk chunk = new Chunk("Hello tagged world!");
chunk.setBackground(new BaseColor(255, 0, 255));
chunk.setFont(FontFactory.getFont("TimesNewRoman", 20, BaseColor.ORANGE));
chunk.setUnderline(BaseColor.PINK, 1.2f, 1, 1, 1, 0);
p.add(chunk);
document.add(p);
document.close();
compareResults("15");
}
@Test
public void createTaggedPdf16() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out16.pdf");
Paragraph p = new Paragraph();
Chunk chunk = new Chunk("Hello tagged world!");
chunk.setBackground(new BaseColor(255, 0, 255));
chunk.setFont(FontFactory.getFont("TimesNewRoman", 20, BaseColor.ORANGE));
chunk.setUnderline(BaseColor.PINK, 1.2f, 1, 1, 1, 0);
p.add(chunk);
PdfDiv div = new PdfDiv();
div.addElement(p);
document.add(div);
document.add(new Paragraph("This paragraph appears between 2 div blocks"));
div = new PdfDiv();
div.addElement(new Paragraph(text));
document.add(div);
document.close();
compareResults("16");
}
@Test
public void createTaggedPdf17() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out17.pdf");
PdfPTable table = new PdfPTable(2);
PdfPCell cell = new PdfPCell(new Paragraph("h1"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("h2"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("footer 1"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("footer 2"));
cell.setColspan(2);
table.addCell(cell);
table.setHeaderRows(4);
table.setFooterRows(2);
try {
PdfPHeaderCell headerCell = new PdfPHeaderCell();
headerCell.setScope(PdfPHeaderCell.ROW);
headerCell.setPhrase(new Phrase("header1"));
headerCell.setName("header1");
table.addCell(headerCell);
PdfPHeaderCell headerCell2 = new PdfPHeaderCell();
headerCell2.setScope(PdfPHeaderCell.ROW);
headerCell2.setPhrase(new Phrase("header2"));
headerCell2.setName("header2");
table.addCell(headerCell2);
cell = new PdfPCell(new Phrase("row 2, column 1"));
cell.addHeader(headerCell);
table.addCell(cell);
cell = new PdfPCell(new Phrase("row 2, column 2"));
cell.addHeader(headerCell2);
cell.addHeader(headerCell2);
table.addCell(cell);
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
document.add(table);
document.close();
compareResults("17");
}
@Test
public void createTaggedPdf18() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out18.pdf");
PdfDiv div = new PdfDiv();
Paragraph paragraph = new Paragraph(text);
paragraph.setFont(new Font(Font.FontFamily.HELVETICA, 8, Font.NORMAL, BaseColor.RED));
div.setBackgroundColor(BaseColor.MAGENTA);
div.setTextAlignment(Element.ALIGN_CENTER);
div.addElement(paragraph);
document.add(div);
document.close();
compareResults("18");
}
@Test
public void createTaggedPdf19() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out19.pdf");
PdfDiv div = new PdfDiv();
writer.getDirectContent().openMCBlock(div);
PdfArtifact artifact = new PdfArtifact();
artifact.setType(new PdfString("Background"));
writer.getDirectContent().openMCBlock(artifact);
writer.getDirectContent().setColorFill(BaseColor.RED);
writer.getDirectContent().rectangle(100, 100, 400, 400);
writer.getDirectContent().fill();
writer.getDirectContent().closeMCBlock(artifact);
writer.getDirectContent().closeMCBlock(div);
document.close();
compareResults("19");
}
@Test
public void createTaggedPdf20() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out20.pdf");
Paragraph paragraph = new Paragraph();
paragraph.getFont().setColor(BaseColor.RED);
Chunk c = new Chunk("Hello ");
paragraph.add(c);
c = new Chunk(" world\n\n");
paragraph.add(c);
ColumnText columnText = new ColumnText(writer.getDirectContent());
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(paragraph);
columnText.go();
PdfTemplate template = writer.getDirectContent().createTemplate(PageSize.A4.getWidth(), PageSize.A4.getHeight());
writer.getDirectContent().addTemplate(template, 0, 0, true);
columnText = new ColumnText(template);
columnText.setSimpleColumn(36, 36, 250, 750);
columnText.addText(new Phrase(new Chunk("Hello word \n")));
columnText.go();
document.newPage();
paragraph = new Paragraph();
paragraph.getFont().setColor(BaseColor.RED);
c = new Chunk("Hello ");
paragraph.add(c);
c = new Chunk(" world\n");
paragraph.add(c);
columnText = new ColumnText(template);
columnText.setSimpleColumn(36, 36, 250, 700);
columnText.addElement(paragraph);
columnText.go();
template = writer.getDirectContent().createTemplate(PageSize.A4.getWidth(), PageSize.A4.getHeight());
writer.getDirectContent().addTemplate(template, 0, 0, true);
paragraph = new Paragraph();
paragraph.getFont().setColor(BaseColor.GREEN);
c = new Chunk("Hello ");
paragraph.add(c);
c = new Chunk(" world\n");
paragraph.add(c);
columnText = new ColumnText(template);
columnText.setSimpleColumn(36, 36, 250, 800);
columnText.addElement(paragraph);
columnText.go();
paragraph = new Paragraph();
paragraph.getFont().setColor(BaseColor.BLUE);
c = new Chunk("Hello ");
paragraph.add(c);
c = new Chunk(" world\n");
paragraph.add(c);
template = writer.getDirectContent().createTemplate(PageSize.A4.getWidth(), PageSize.A4.getHeight());
columnText = new ColumnText(template);
columnText.setSimpleColumn(36, 36, 250, 650);
columnText.addElement(paragraph);
columnText.go();
writer.getDirectContent().addTemplate(template, 0, 100);
writer.getDirectContent().addTemplate(template, 0, 50);
writer.getDirectContent().addTemplate(template, 0, 0);
document.close();
compareResults("20");
}
@Test
public void createTaggedPdf21() throws DocumentException, IOException, ParserConfigurationException, SAXException {
try {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out21.pdf");
PdfTemplate template = writer.getDirectContent().createTemplate(PageSize.A4.getWidth(), PageSize.A4.getHeight());
writer.getDirectContent().addTemplate(template, 0, 0, true);
ColumnText columnText = new ColumnText(template);
columnText.setSimpleColumn(36, 36, 250, 750);
columnText.addText(new Phrase("Hello word \n\n"));
columnText.go();
document.newPage();
writer.getDirectContent().addTemplate(template, 0, 0);
document.close();
} catch (Exception conformExc) {
junit.framework.Assert.assertEquals("Template with tagged content could not be used more than once.", conformExc.getMessage());
return;
} finally {
document.close();
}
junit.framework.Assert.fail("Expected error: 'Template with tagged content could not be used more than once.");
}
@Test
public void createTaggedPdf22() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out22.pdf", PdfWriter.VERSION_1_4);
Paragraph p = new Paragraph();
PdfName nParagraph = new PdfName("Paragraph");
p.setRole(nParagraph);
writer.getStructureTreeRoot().mapRole(nParagraph, PdfName.P);
try {
Chunk c = new Chunk("Quick brown ");
PdfName nTextBlock = new PdfName("TextBlock");
c.setRole(nTextBlock);
writer.getStructureTreeRoot().mapRole(nTextBlock, PdfName.SPAN);
p.add(c);
Image i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/fox.bmp");
c = new Chunk(i, 0, 0);
PdfName nImage = new PdfName("Image");
c.setRole(nImage);
writer.getStructureTreeRoot().mapRole(nImage, PdfName.FIGURE);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Fox image"));
p.add(c);
p.add(new Chunk(" jumped over a lazy "));
i = Image.getInstance("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/dog.bmp");
c = new Chunk(i, 0, 0);
c.setAccessibleAttribute(PdfName.ALT, new PdfString("Dog image"));
p.add(c);
} catch (Exception e) {
}
document.add(h1);
document.add(p);
document.close();
compareResults("22");
}
@Test
public void createTaggedPdf23() throws DocumentException, IOException, ParserConfigurationException, SAXException {
initializeDocument("./target/com/itextpdf/test/pdf/TaggedPdfTest/out23.pdf", PdfWriter.VERSION_1_4);
PdfPTable table = new PdfPTable(2);
PdfPCell cell = new PdfPCell(new Paragraph("header 1"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("header 2"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("footer 1"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("footer 2"));
cell.setColspan(2);
table.addCell(cell);
table.setHeaderRows(4);
table.setFooterRows(2);
try {
for (int i = 1; i <= 50; i++) {
table.addCell("row " + i + ", column 1");
table.addCell("row " + i + ", column 2");
}
} catch (Exception e) {
}
document.add(table);
document.close();
compareResults("23");
}
@Test
public void createTaggedPdf24() throws DocumentException, IOException, ParserConfigurationException, SAXException {
Document document = new Document(PageSize.LETTER);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, baos);
writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
//set more document properties
writer.setPdfVersion(PdfWriter.VERSION_1_7);
writer.setTagged(PdfWriter.markInlineElementsOnly);
PdfDictionary info = writer.getInfo();
info.put(PdfName.TITLE, new PdfString("Testing"));
writer.createXmpMetadata();
// step 3
document.open();
document.addLanguage("en_US");
document.setAccessibleAttribute(PdfName.LANG, new PdfString("en_US"));
// step 4
Paragraph p = new Paragraph("Paragraph testing testing");
p.setAccessibleAttribute(PdfName.ACTUALTEXT, new PdfString("Paragraph ALT Text"));
p.setAccessibleAttribute(PdfName.ALT, new PdfString("Paragraph ALT Text"));
document.add(p);
BaseFont bFont = BaseFont.createFont("./src/test/resources/com/itextpdf/text/pdf/FreeMonoBold.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED);
Font font = new Font(bFont, 12);
Chunk ck = new Chunk("Span testing testing", font);
ck.setAccessibleAttribute(PdfName.ACTUALTEXT, new PdfString("Span ALT Text"));
ck.setAccessibleAttribute(PdfName.ALT, new PdfString("Span ALT Text"));
p = new Paragraph(ck);
document.add(p);
// step 5
document.close();
FileOutputStream fos = new FileOutputStream(new File("./target/com/itextpdf/test/pdf/TaggedPdfTest/out24.pdf"));
fos.write(baos.toByteArray());
fos.flush();
fos.close();
compareResults("24");
}
/**
* Resulting pdf should pass all tests in PAC2.
* 13 0 obj should contain three repeating 4 0 R references and three 8 0 R.
*/
@Test
public void createTaggedPdf25() throws DocumentException, IOException, ParserConfigurationException, SAXException, InterruptedException {
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, baos);
writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
//set more document properties
writer.setPdfVersion(PdfWriter.VERSION_1_7);
writer.setTagged();
PdfDictionary info = writer.getInfo();
info.put(PdfName.TITLE, new PdfString("Testing"));
writer.createXmpMetadata();
// step 3
document.open();
document.addLanguage("en_US");
document.setAccessibleAttribute(PdfName.LANG, new PdfString("en_US"));
// step 4
String longParagraphString = "Long teeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeext Paragraph testing testing";
BaseFont bFont = BaseFont.createFont("./src/test/resources/com/itextpdf/text/pdf/FreeMonoBold.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED);
Font font = new Font(bFont, 12);
Paragraph p = new Paragraph(longParagraphString, font);
document.add(p);
String longChunkString = "Long teeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeext Span testing testing";
Chunk ck = new Chunk(longChunkString, font);
p = new Paragraph(ck);
document.add(p);
// step 5
document.close();
String outPath = "./target/com/itextpdf/test/pdf/TaggedPdfTest/";
String outFile = outPath + "out25.pdf";
FileOutputStream fos = new FileOutputStream(new File(outFile));
fos.write(baos.toByteArray());
fos.flush();
fos.close();
compareResults("25");
CompareTool compareTool = new CompareTool();
String cmpFile = "./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/out25.pdf";
String errorMessage = compareTool.compareByContent(outFile, cmpFile, outPath, "diff_");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
@Test
public void createTaggedPdf26() throws DocumentException, IOException, ParserConfigurationException, SAXException, InterruptedException {
Document doc = new Document(PageSize.LETTER, 72, 72, 72, 72);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(doc, baos);
writer.setTagged();
doc.open();
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setUseAscender(true);
ct.setAdjustFirstLine(true);
ct.setSimpleColumn(doc.left(), doc.bottom(), doc.right(), doc.top());
Paragraph p = new Paragraph("before");
ct.addElement(p);
List list = new List(List.ORDERED, List.NUMERICAL);
list.setAutoindent(false);
list.setIndentationLeft(14);
list.setSymbolIndent(14);
list.add("Item 1");
List nested = new List(List.ORDERED, List.NUMERICAL);
nested.setAutoindent(false);
nested.setIndentationLeft(14);
nested.setSymbolIndent(14);
nested.add("Nested 1");
list.add(nested);
ct.addElement(list);
p = new Paragraph("after");
ct.addElement(p);
ct.go();
doc.close();
String outPath = "./target/com/itextpdf/test/pdf/TaggedPdfTest/";
new File(outPath).mkdirs();
String outFile = outPath + "out26.pdf";
FileOutputStream fos = new FileOutputStream(new File(outFile));
fos.write(baos.toByteArray());
fos.flush();
fos.close();
compareResults("26");
}
@Test
public void createTaggedPdf27() throws DocumentException, IOException, ParserConfigurationException, SAXException, InterruptedException {
Document doc = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(doc, baos);
writer.setTagged();
doc.open();
String imagePath = "./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/Desert.jpg";
Image img = Image.getInstance(imagePath);
img.setAbsolutePosition(0, 0);
img.setAccessibleAttribute(PdfName.E, new PdfString("expansion"));
img.setAccessibleAttribute(PdfName.ALT, new PdfString("alt"));
PdfTemplate template = writer.getDirectContent().createTemplate(img.getWidth(), img.getHeight());
writer.getDirectContent().addTemplate(template, 100, 300, true);
ColumnText ct = new ColumnText(template);
ct.setSimpleColumn(0, 0, 250, 300);
ct.addElement(img);
ct.go();
doc.close();
String outPath = "./target/com/itextpdf/test/pdf/TaggedPdfTest/";
new File(outPath).mkdirs();
String outFile = outPath + "out27.pdf";
FileOutputStream fos = new FileOutputStream(new File(outFile));
fos.write(baos.toByteArray());
fos.flush();
fos.close();
compareResults("27");
}
private boolean compareXmls(String xml1, String xml2) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setCoalescing(true);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setIgnoringComments(true);
DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document doc1 = db.parse(new File(xml1));
doc1.normalizeDocument();
org.w3c.dom.Document doc2 = db.parse(new File(xml2));
doc2.normalizeDocument();
return doc2.isEqualNode(doc1);
}
static class MyTaggedPdfReaderTool extends TaggedPdfReaderTool {
@Override
public void parseTag(String tag, PdfObject object, PdfDictionary page)
throws IOException {
if (object instanceof PdfNumber) {
PdfNumber mcid = (PdfNumber) object;
RenderFilter filter = new MyMarkedContentRenderFilter(mcid.intValue());
TextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
FilteredTextRenderListener listener = new FilteredTextRenderListener(
strategy, filter);
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(
listener);
processor.processContent(PdfReader.getPageContent(page), page
.getAsDict(PdfName.RESOURCES));
out.print(XMLUtil.escapeXML(listener.getResultantText(), true));
} else {
super.parseTag(tag, object, page);
}
}
@Override
public void inspectChildDictionary(PdfDictionary k) throws IOException {
inspectChildDictionary(k, true);
}
}
static class MyMarkedContentRenderFilter extends MarkedContentRenderFilter {
int mcid;
public MyMarkedContentRenderFilter(int mcid) {
super(mcid);
this.mcid = mcid;
}
@Override
public boolean allowText(TextRenderInfo renderInfo){
return renderInfo.hasMcid(mcid, true);
}
}
@After
public void finalize() {
Document.compress = true;
}
private void compareResults(String name) throws IOException, ParserConfigurationException, SAXException {
PdfReader reader = new PdfReader("./target/com/itextpdf/test/pdf/TaggedPdfTest/out"+ name +".pdf");
FileOutputStream xmlOut = new FileOutputStream("./target/com/itextpdf/test/pdf/TaggedPdfTest/test"+ name +".xml");
new MyTaggedPdfReaderTool().convertToXml(reader, xmlOut);
xmlOut.close();
Assert.assertTrue(compareXmls("./src/test/resources/com/itextpdf/text/pdf/TaggedPdfTest/test"+ name +".xml", "./target/com/itextpdf/test/pdf/TaggedPdfTest/test"+ name +".xml"));
}
}